package cn.iocoder.yudao.module.eval.service.plan;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.eval.controller.admin.plan.vo.EvalPlanPageReqVO;
import cn.iocoder.yudao.module.eval.controller.admin.plan.vo.EvalPlanSaveReqVO;
import cn.iocoder.yudao.module.eval.dal.dataobject.plan.EvalPlanDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 评价计划 Service 接口
 *
 * @author 芋道源码
 */
public interface EvalPlanService {

    /**
     * 创建评价计划
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createPlan(@Valid EvalPlanSaveReqVO createReqVO);

    /**
     * 更新评价计划
     *
     * @param updateReqVO 更新信息
     */
    void updatePlan(@Valid EvalPlanSaveReqVO updateReqVO);

    /**
     * 删除评价计划
     *
     * @param id 编号
     */
    void deletePlan(Long id);

    /**
     * 获得评价计划
     *
     * @param id 编号
     * @return 评价计划
     */
    EvalPlanDO getPlan(Long id);

    /**
     * 获得评价计划列表
     *
     * @param ids 编号
     * @return 评价计划列表
     */
    List<EvalPlanDO> getPlanList(Collection<Long> ids);

    /**
     * 获得评价计划分页
     *
     * @param pageReqVO 分页查询
     * @return 评价计划分页
     */
    PageResult<EvalPlanDO> getPlanPage(EvalPlanPageReqVO pageReqVO);

    /**
     * 根据计划编码获得评价计划
     *
     * @param planCode 计划编码
     * @return 评价计划
     */
    EvalPlanDO getPlanByCode(String planCode);

    /**
     * 根据状态获得评价计划列表
     *
     * @param planStatus 计划状态
     * @return 评价计划列表
     */
    List<EvalPlanDO> getPlanListByStatus(Integer planStatus);

    /**
     * 根据状态列表获得评价计划列表
     *
     * @param planStatuses 计划状态列表
     * @return 评价计划列表
     */
    List<EvalPlanDO> getPlanListByStatuses(Collection<Integer> planStatuses);

    /**
     * 根据职业ID获得评价计划列表
     *
     * @param professionId 职业ID
     * @return 评价计划列表
     */
    List<EvalPlanDO> getPlanListByProfessionId(Long professionId);

    /**
     * 更新计划状态
     *
     * @param id 编号
     * @param planStatus 计划状态
     */
    void updatePlanStatus(Long id, Integer planStatus);

    /**
     * 复制评价计划
     *
     * @param id 原计划编号
     * @param newPlanName 新计划名称
     * @param newPlanCode 新计划编码
     * @return 新计划编号
     */
    Long copyPlan(Long id, String newPlanName, String newPlanCode);

    /**
     * 批量创建评价计划
     *
     * @param createReqVO 创建信息
     * @param batchCount 批次数量
     * @return 计划编号列表
     */
    List<Long> batchCreatePlans(@Valid EvalPlanSaveReqVO createReqVO, Integer batchCount);

    /**
     * 提交计划审批
     *
     * @param id 编号
     */
    void submitPlanForApproval(Long id);

    /**
     * 审批计划
     *
     * @param id 编号
     * @param approved 是否通过
     * @param comments 审批意见
     */
    void approvePlan(Long id, Boolean approved, String comments);

    /**
     * 发布计划
     *
     * @param id 编号
     */
    void publishPlan(Long id);

    /**
     * 开始评价
     *
     * @param id 编号
     */
    void startEvaluation(Long id);

    /**
     * 完成评价
     *
     * @param id 编号
     */
    void completeEvaluation(Long id);

    /**
     * 取消计划
     *
     * @param id 编号
     * @param reason 取消原因
     */
    void cancelPlan(Long id, String reason);

    /**
     * 获取计划统计信息
     *
     * @param id 编号
     * @return 统计信息
     */
    Object getPlanStatistics(Long id);

    /**
     * 检查计划是否可以删除
     *
     * @param id 编号
     * @return 是否可以删除
     */
    boolean canDeletePlan(Long id);

    /**
     * 检查计划是否可以修改
     *
     * @param id 编号
     * @return 是否可以修改
     */
    boolean canUpdatePlan(Long id);

}
